package org.javaboy.ack_demo.consumer;

import com.rabbitmq.client.Channel;
import org.javaboy.ack_demo.config.QueueConfig;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class AckConsumer {

    //ResponseEntity
    @RabbitListener(queues = QueueConfig.QUEUE_NAME)
    public void handleMsg(Channel channel, Message msg) throws IOException {
        String correlationId = msg.getMessageProperties().getCorrelationId();
        //1. 先去 Redis 检查是否存在 correlationId，如果存在，则说明消息已经消费过了，那么直接 ack 即可
        //2. 如果不存在 correlationId，则说明消息没有消费过，那么需要处理业务逻辑，处理完业务逻辑之后，再 ack 消息，同时把 correlationId 存到 Redis 中

        // 获取消息的tag
        long deliveryTag = msg.getMessageProperties().getDeliveryTag();
        try {
            //消费者里边抛出异常，则消费者就会告诉mq消费失败
//            int i = 1 / 0;

            System.out.println("接收到消息：" + msg);
            // 手动确认消息消费成功，false 表示 deliveryTag 之前的消息是否全部消费成功
            channel.basicAck(deliveryTag, false);
        } catch (Exception e) {
            //手动确认消息消费失败
//            channel.basicNack(deliveryTag, false, true);
            //拒绝消费
//            channel.basicReject(deliveryTag, true);
            throw new RuntimeException(e);
        }
    }
}
